package pre_processing;

import java.io.ObjectInputStream.GetField;
import java.util.ArrayList;

public class Winnowing {

	public static ArrayList<String> fingerprint(String masukan, int window_size){
		/**
		 * buat objek hasilFingerprint sebagai penampung hasil fingerprint
		 */
		ArrayList<String> hasilFingerprint = new ArrayList<String>();
		
		/**
		 * mengganti semua simbol menjadi spasi
		 */
		masukan = masukan.replaceAll("[.,!?]", " ");
		
		/**
		 * memotong-motong String masukan menjadi array dari kata_masukan
		 */
		String[] kata_masukan = masukan.split("\\s+");
		
		/**
		 * inisialisasi isi array window
		 */
		ArrayList<String> window = new ArrayList<String>();
		
		/**
		 * memasukkan array kata_asukkan ke array window pertama kali
		 */
		for (int i=0; i<window_size; i++){
			window.add(kata_masukan[i]);
		}
		
		/**
		 * array window dicari nilai terkecilnya
		 */
		hasilFingerprint.add(get_min_hash_window(window));
		
		/**
		 * looping kata_masukan selanjutnya
		 */
		for (int i=window_size; i<kata_masukan.length; i++){
			/**
			 * hapus hash paling depan
			 */
			window.remove(0);
			
			/**
			 * tambahkan kata_masukan selanjutnya pada array window
			 */
			window.add(kata_masukan[i]);
			
			/**
			 * array window dicari nilai terkecilnya
			 */
			String temp=get_min_hash_window(window);
			
			/**
			 * use this agar fingerprint tidak berulan sequential
			 */
//			if (!hasilFingerprint.get(hasilFingerprint.size()-1).equals(temp)){
//					hasilFingerprint.add(temp);
//			}
			
		}
		
		/**
		 * looping untuk menampilkan hasil fingerprint
		 */
		System.out.print("Hasil fingerprint : ");
		for(int i=0; i<hasilFingerprint.size();i++){
			System.out.print(hasilFingerprint.get(i)+" ");
		}
		
		/**
		 * kembalikan array fingerprint
		 */
		return hasilFingerprint;
	}
	
	/**
	 * dari n window yang masing-masing berisi hash words, akan mengeluarkan hash terkecil
	 * @param win -> array hash
	 * @return hash terkecil
	 */
	public static String get_min_hash_window(ArrayList<String> win){
		/**
		 * minimum diisi dengan bilangan paling besar terebih dahulu
		 */
		int minimum = 999999999;
		String min = null;
		
		/**
		 * looping pencarian bilangan terkecil
		 */
		for(int i=0; i<win.size();i++){
			/**
			 * jika hash lebih kecil dimasukkan ke minimum dan min 
			 */
			if (win.get(i).hashCode()<minimum){
				minimum = win.get(i).hashCode();
				min = win.get(i);
			}
		}
		/**
		 * kembalihan hash paling kecil
		 */
		return min;
	}
	
}
